
%Packages
\documentclass{article}
\usepackage{fancyhdr}
\usepackage{amsmath} %Mathematics Symbols
\usepackage{amsfonts} 
\usepackage{amssymb} 
\usepackage[a4paper, left=3cm, right=3cm]{geometry}

\usepackage[spanish]{babel} %For Spanish Caracters
\usepackage[latin1]{inputenc} %For Spanish Format
\usepackage[pdftex]{graphicx} %For Graphics in Post Script format

\title{Programaci\'on Orientada a Objetos\\Trabajo Especial\\\textbf{Lasers \& Mirrors}}
\author{Daniel Goldberg\\M. Eugenia Cura}
\date{ }

\begin{document}
	\maketitle

\newpage

\section*{Introducci\'on}
El trabajo pr\'actico especial consiste en la implementaci\'on de una aplicaci\'on
que es una variante del juego \textit{"Lasers and Mirrors"}. El juego consiste en un tablero en donde hay celdas de las cuales se dispara un rayo l\'aser y celdas a las cuales estos rayos deben alcanzar.

\section*{Diagrama de clases}
\newpage

\section*{Jerarqu\'ia de clases}
El objeto principal de esta implementaci\'on es el de la clase \textbf{Tablero}. Existe una instancia de esta clase por cada nivel existente en la aplicaci\'on.

Esta clase contiene una matriz de elementos de la clase \textbf{Celda}. El tama\~no de la matriz depende del especificado por cada nivel. Cada uno de estos objetos contiene un objeto de la clase \textbf{Elemento} (clase abstracta) y un set formado por objetos de la clase \textbf{Laser}.
Si por la celda no pasa ningun objeto (laser o elemento), \'esta no existe y es creada en el momento en el que algun objeto pasa por ella. 

De la clase \textbf{Elemento} heredan cinco clases distintas: \textbf{Origen}, \textbf{Destino}, \textbf{Espejo} (clase abstracta), \textbf{Pared} y \textbf{Trampa}.
La clase \textbf{Espejo} es una clase abstracta ya que no se pueden instanciar objetos a partir de ella. No puede existir ningun objeto de la clase \textbf{Espejo}.
Esto se debe a que existen tres tipos de objetos que si son instanciables, estos son: \textbf{EspejoSimple}, \textbf{EspejoSemi} y \textbf{EspejoDoble}.

La clase \textbf{Laser} tiene tambi\'en una subclase \textbf{HalfLaser}. Estas dos clases tienen el  mismo comportamiento, la \'unica diferencia es el dibujo que los representa.

La clase \textbf{Tablero} utiliza funciones de la clase \textbf{Parser}. Esta clase solamente est\'a creada para proporcionar los m\'etodos de entrada y salida de los archivos de niveles a la aplicaci\'on. Esta clase contiene un \'unico m\'etodo que es espec\'ifico para el tipo de archivos de niveles proporcionados por la c\'atedra.

Adem\'as de esto existen las clases que manejan los puntajes del juego. Estas son las clases \textbf{Puntaje} y \textbf{Puntajes}. La clase \textbf{Puntaje} es la encargada de crear cada uno de los puntajes y contiene un \textit{jugador} y un \textit{puntaje}. La clase \textbf{Puntajes} contiene un Set de puntajes. Se agregan a \'el todos los puntajes mientras no sean exactamente iguales (mismo nombre y mismo puntaje). Existe una instancia de la clase \textbf{Puntajes} para cada nivel existente en la aplicaci\'on.

\section*{Aplicaci\'on}
Al iniciar la aplicaci\'on se abre una ventana con un men\'u principal. 

 \begin{center}
\includegraphics[scale=0.5]{menu.jpg}                                      \end{center}

Al hacer click en \texttt{Nuevo Juego} aparece una ventana que pide al jugador que ingrese el nombre de usuario.

 \begin{center}
\includegraphics[scale=0.5]{usuario.jpg}                                         \end{center}

Al hacer click en \texttt{Aceptar} \'esta \'ultima ventana se transforma en el panel del primer nivel.
En esta podemos ver un tablero del nivel correspondiente y dos botones. 

 \begin{center}
\includegraphics[scale=0.5]{juego.jpg}                                       \end{center}

Si se hace click sobre el bot\'on de \textit{Guardar Partida} el usuario elige el nombre del archivo y en qu\'e directorio guardarlo. No podr\'a hacerlo en el directorio \textit{levels}.
%  \includegraphics{guardar.png}

Si se hace click sobre el bot\'on \textit{Creo que gane!} la aplicaci\'on pasar\'a al pr\'oximo nivel \'unicamente si se verifica que se ha ganado el nivel realmente. Si no se ha ganado, la aplicaci\'on continuar\'a en el mismo nivel.

Si se elige hacer click sobre \textit{Cargar Juego Guardado}, se abre una ventana en la cual el usuario podr\'a elegir un archivo guardado previamente. Si el archivo es v\'alido y coincide con alguno de los niveles existentes se continuar\'a la partida anterior desde el nivel que se hab\'ia dejado.

Si se elige hacer click sobre \textit{Ver Mejores Puntajes} se abrir\'a una ventana en la cual se puede elegir los puntajes de qu\'e nivel mostrar. 
 
%  \includegraphics[scale=0.5]{elegirPunt.jpg}

Al hacer click en \textit{Aceptar} se mostrar\'an los 10 mejores puntajes de ese nivel. En el caso de haber menor cantidad de puntajes se mostrar\'an todos los existentes.
 
 \begin{center}
\includegraphics[scale=0.4]{puntajes.jpg}                                          \end{center}


Al hacer click en \textit{Salir} se cerrar\'a la aplicaci\'on.


\section*{Problemas encontrados durante el desarrollo}
No tuvimos muchos problemas durante el desarrollo ya que cada etapa fue discutida previamente y se intent\'o siempre encontrar la mejor soluci\'on posible previo al desarrollo.

El mayor problema encontrado fue en el momento de desarrollar el algoritmo que agrega los lasers al tablero. Este algoritmo fue desarrollado en una etapa previa sin tener en consideraci\'on que existian los \textit{HalfLasers}. Cuando nos vimos enfrentados a este problema hubo que re-codificar todo el algoritmo ya que modificaba toda la l\'ogica que habiamos utilizado.


\section*{Decisiones de dise\~no tomadas}
Una decisi\'on de dise\~no tomada fue crear la clase \textbf{Parser} como una clase aparte en vez de agregar la \'unica funci\'on que contiene dentro de la clase \textbf{Tablero}. Esto se debe a que creimos que, aunque \'esta no es una clase que sea realmente un objeto ni contiene sublases que lo sean, debe colocarse en un lugar aparte ya que realmente no se le aplica a una instancia de tablero, sino que devuelve uno, teniendo como par\'ametro el archivo desde el cual se crea el nivel.

Otra decisi\'on de dise\~no fue crear la clase abstracta \textbf{Elemento} que contiene como subclases a todos los elementos definidos en un nivel que contiene el tablero. Esta decisi\'on fue tomada con posterioridad al dise\~no de jerarqu\'ia de clases ya que nos dimos cuenta que hab\'ia varios comportamientos que los elementos tenian en com\'un ya que todos cumplen alguna funci\'on dentro del tablero. Fue una decisi\'on de dise\~no tambi\'en impementar la misma como una clase abstracta de la cual heredan los elementos del tablero y no como una interfaz de la cual implementan su comportamiento.


\newpage
\section*{C\'odigo fuente}


\end{document}
